//RECORRER LOS ATRIBUTOS DE UN OBJETO RECURSIVAMENTE

var me = {
    nombre: 'pepe',     
    car: {
        marca: 'Toyota',
        motor : {
            tipo: 'diesel'
        }
    }
};

function verAtributos (objeto, nombre, profundidad) {
    if (profundidad < 0) {
        profundidad = undefined;
    }
    if ((profundidad > 0 || profundidad == undefined) && typeof objeto == 'object')  {
        for (var atributo in objeto) {    
            verAtributos (objeto[atributo], nombre + "." + atributo, profundidad - 1);
        }
    } else {
        if (objeto || objeto == 0) {
            console.log(nombre + " = " + objeto);
        }
    }    
}

verAtributos(me, 'me', 3);


//TRABAJAR CON FUNCIONES COMO PARÁMETROS DE OTRAS FUNCIONES



function ordenar (array , comparador) {
    for (var i = 0; i< array.length - 1; i++) {
        for (var j = i + 1; j < array.length ; j++) {
            if (comparador(array[i],array[j]) > 0) {
                var aux = array[i];
                array[i] = array[j];
                array[j] = aux;
            }
        }
    }
}


function imprimir(array) {
    var s = "";
    for (var i = 0; i< array.length; i++) {
        s += array[i] + " ";
    }
    console.log(s);
}


function numerosAscendente (a ,b) {
    return a - b;
}

function numerosDescendente (a ,b) {
    return b - a;
}

function ver(x) {
    console.log(x);
}

function esNegativo(x) {
    /*if (x < 0) {
        return true;
    } else {
        return false;
    }*/

    return x < 0;
}

function incrementar(x) {
    return x + 1;
}

function ponerTexto(x) {
    return "Número " + x;
}




var array = [2,-3,4,2];
ordenar(array, numerosAscendente);
imprimir(array);
ordenar(array, numerosDescendente);
imprimir(array);

//TRABAJAR CON MÉTODOS DE ARRAYS QUE RECIBEN FUNCIONES
array.sort(numerosAscendente);
imprimir(array);
array.forEach(ver);
console.log(array.every(esNegativo));
console.log(array.some(esNegativo));
imprimir (array.map(incrementar));
imprimir (array.map(ponerTexto));
imprimir (array.filter(esNegativo));

//Reduce agrupa todos los elementos del array en un único elemento

//Por ejemplo para sumar los elementos del array
console.log (array.reduce(
        function (suma , valor) {
            return suma + valor;
        }
    )
);


//Para obtener el mayor elemento de un array
console.log (array.reduce(
        function (mayor, valor) {
            if (mayor > valor) {
                return mayor;
            } else {
                return valor;
            }
        }
    )
);

//Para obtener el mayor elemento de un array
console.log (array.reduce(
        function (mayor, valor) {
           if (mayor > valor) {
               return mayor;
           } else {
               return valor;
           }
        }
    )
);


//Para obtener el mayor elemento de un array
console.log (array.reduce(
        function (negativos, valor) {
           if (valor < 0) {
               return negativos + 1;
           } else {
               return negativos;
           }
        }
    ,0)
);

//Contar negativos. Poco eficiente
console.log (array.reduce(
        function (negativos, valor) {
           if (valor < 0) {
               return negativos + 1;
           } else {
               return negativos;
           }
        }
    ,0)
);

//¿Hay negativos?. Poco eficiente
console.log (array.reduce(
        function (negativos, valor) {
           if (valor < 0) {
               return negativos + 1;
           } else {
               return negativos;
           }
        }
    ,0)
>0);


//¿Hay negativos?. Poco eficiente
console.log (array.reduce(
        function (hayNegativos, valor) {
           if (valor < 0) {           	
               return true;
           } else {
               return hayNegativos || false;
           }
        }
    ,false)
);




